/**
 * @file Excel.h
 * @author shikang999@126.com
 * @brief 
 * @version 0.1
 * @date 2025-06-17
 * 
 * @copyright Copyright (c) 2025
 * 
 */
#pragma once
#include <map>
#include <vector>
#include <memory>
#include <string>
#include <string_view>
namespace Excel
{
//1.单元
struct Cell_t
{
    Cell_t(uint32_t rowIndex, uint32_t colIndex, const std::string &srcKey, const std::string &text):row(rowIndex), col(colIndex), key(srcKey), value(text)
    {

    }

    uint32_t row;     //行号,从1开始
    uint32_t col;     //列号,从1开始
    std::string key;  //单元位置,例如"A23"
    std::string value;//单元里的内容
};

//2.表
struct Sheet_t
{
    Sheet_t(const std::string &srcName) : name(srcName)
    {

    }

    std::string name;
    std::map<std::string, std::shared_ptr<Cell_t>> mapKey;                   //按key索引值
    std::map<uint32_t, std::map<uint32_t, std::shared_ptr<Cell_t>>> mapValue;//按行列索引值<row, <col, >>
};
using vecSheet_t = std::vector<std::shared_ptr<Sheet_t>>;

//3. 读取xlsx类
class Excel
{
public:
    Excel();
    ~Excel();

    //读取xlsx文件,读取失败返回False,否则返回True
    bool read(const std::string &excelFile);

    //获取所有表
    const vecSheet_t &getAllSheet() const;

private:
    //初始化共享字符串
    void initSharedStr(void *zip);

    //添加表
    void addSheet(void *zip, uint32_t index, const std::string &name);

    //解析表
    void parseSheet(std::shared_ptr<Sheet_t> &sheet, const std::string &text) const;

    //解析索引,这个不检查s的正确性. s必须是类似 A12, AB23  这种格式
    std::pair<uint32_t, uint32_t> paraseIndex(const std::string &s) const;

private:
    vecSheet_t vecSheet_;                  //所有表
    std::vector<std::string> vecSharedStr_;//存储解析时的共享字符串
};

}